package top.chenziji.Util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;

public class FileHandle {

    // 文件路径
    private static final String FILE_PATH = "c:/output.txt";

    public static void compress(String inFilePath,String FileName,String outFilePathDir,String password){
        // 设置 7-Zip 的路径
        String sevenZipPath = "C:/Program Files/7-Zip/7z.exe";

        // 设置要压缩的文件路径
        String sourceFile =inFilePath;
        long timestamp1 = System.currentTimeMillis();
        // 设置目标压缩文件路径
        String archivePath = outFilePathDir+"\\"+timestamp1+".7z";

        // 构造命令
        String[] command = {
                sevenZipPath,       // 7z.exe 路径
                "a",                 // 添加文件到压缩包
                "-t7z",              // 设置压缩格式为 7z
                "-p" + password,     // 设置压缩密码
                "-mhe=on",           // 启用加密文件名
                archivePath,         // 输出压缩文件路径
                sourceFile           // 要压缩的文件路径
        };

        // 创建 ProcessBuilder 对象来执行命令
        ProcessBuilder processBuilder = new ProcessBuilder(command);

        // 设置工作目录（可选）
        processBuilder.directory(new File("E:/"));

        try {
            // 启动进程
            Process process = processBuilder.start();

            // 等待进程完成
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                System.out.println("文件已成功压缩并加密！");
                writeTextJL(timestamp1+".7z====="+FileName);
                Path path = Paths.get(inFilePath);
                try {
                    Files.delete(path);
                    System.out.println("文件删除成功");
                } catch (IOException e) {
                    System.out.println("文件删除失败: " + e.getMessage());
                }

            } else {
                System.err.println("压缩过程发生错误，退出代码：" + exitCode);
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void writeTextJL(String dataToWrite){
        // 判断文件是否存在
        if (!fileExists(FILE_PATH)) {
            // 文件不存在，创建文件并写入第一行
            writeToFile(dataToWrite);
            System.out.println("文件不存在，已创建并写入第一行数据");
        } else {
            // 文件存在，读取所有行
            List<String> allLines = readFromFile();
            // 如果文件为空（没有数据），则添加第一行
            if (allLines.isEmpty()) {
                writeToFile(dataToWrite);
                System.out.println("文件为空，已写入第一行数据");
            } else {
                // 否则追加到文件的下一行
                appendToFile(dataToWrite);
                System.out.println("文件存在，已追加新的一行数据");
            }
        }
    }


    // 检查文件是否存在
    public static boolean fileExists(String filePath) {
        Path path = Paths.get(filePath);
        return Files.exists(path);
    }

    // 读取文件的所有行
    private static List<String> readFromFile() {
        List<String> lines = new ArrayList<>();
        try {
            lines = Files.readAllLines(Paths.get(FILE_PATH));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return lines;
    }

    // 写入数据到文件（如果文件为空或者第一次创建）
    public static void writeToFile(String data) {
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(FILE_PATH), StandardOpenOption.CREATE)) {
            writer.write(data);   // 写入字符串到文件
            writer.newLine();     // 换行
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 追加数据到文件的下一行
    private static void appendToFile(String data) {
        try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(FILE_PATH), StandardOpenOption.APPEND)) {
            writer.write(data);   // 追加字符串到文件
            writer.newLine();     // 换行
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
